Processors (e.g., microprocessors) are well known and used in a wide variety of products and applications, from desktop computers to portable electronic devices, such as cellular phones and PDAs (personal digital assistants). As is known, some processors are extremely powerful (e.g., processors in high-end computer workstations), while other processors have a simpler design, for lower-end, less expensive applications and products.
Platform-independent programming languages, such as the “Java” programming language from Sun Microsystems, Inc., offer different structural and operational features than traditional, platform-specific languages. A platform-independent programming language typically utilizes platform-independent program code (machine-readable instructions) suitable for execution on multiple hardware platforms without regard for the particular instruction set for the hardware platforms. A hardware platform typically includes a computer system having one or more processors (e.g., microprocessors or microcontrollers) which execute a particular set of instructions having a specific format, sometimes referred to as a native instruction set. This is in contrast to platform-specific languages, which utilize platform-specific compilers to generate program code that is native to one particular hardware platform. While the same source code may in some instances be compiled by different platform-specific compilers into suitable program code for multiple platforms, the resulting program code is not platform-independent.
One class of instruction sets includes those instruction sets that use a stack-based approach to storing and manipulating data items upon which they act. The stack within a data processing system supporting such a stack-based instruction set may store a sequence of data items, for example operand values, that are placed into the stack in a particular order and then removed from the stack in the reverse of that order. Thus, the last data item to be placed into the stack will also typically be the first data item to be removed from the stack. Stack-based processors may provide a stack consisting of a plurality of addressable stack entries to which data items may be written and from which data items may be read in conjunction with a stack pointer which indicates the current “top” position within the stack. The stack pointer specifies a reference point within the stack memory which identifies the latest data item to be stored into the stack and from which other accesses to the stack may be referenced.
One example of a stack-based instruction set is the Java Virtual Machine instruction set, as specified by Sun Microsystems Inc. The Java programming language seeks to provide an environment in which computer software written in Java can be executed upon many different processing hardware platforms without having to alter the Java software.
Another class of instruction sets includes those instruction sets that use a register-based approach to storing and manipulating the data items upon which they act. An example of such register-based systems are the ARM processors produced by ARM Limited of Cambridge, England. ARM instructions execute operations (such as mathematical manipulations, loads, stores, etc) upon operands stored within registers of the processor specified by register fields within the instructions.
Certain data processing systems designed to execute register-based instructions are known to also support execution of stack-based instructions. In such systems, stack-based instructions are converted into a sequence of operations to be executed by the processor core using registers within a register bank or register set. The data items on the stack that are required by those operations are stored from the stack into registers of the register bank so that they are available to the processor core. Typically, a set of registers within the register bank are allocated to hold stack data items (also referred to herein as stack operands) from a portion of the stack. A plurality of different mapping states may be provided in which different registers within the set hold respective stack operands from different positions within the portion of the stack. The mapping state may be changed in dependence upon operations that add or remove stack operands held within the set of registers used for the stack in a manner that provides a function similar to that of a stack pointer within a stack. Such an approach seeks to reduce the processing overhead required to provide stack-like storage within the registers of a register-based processor.
In such a system, the stack entries in the stack may be considered to be of a fixed size, and each register in the set of registers allocated to hold stack operands may be arranged to only store the data corresponding to one stack entry. However, the registers of the processor core that may be devoted to the storage of stack operands may be limited by the need to provide other registers for functions such as the management of the decoding of the stack-based instructions into operations to be executed within the register-based processor, and for the emulation of other control values, such as a variables pointer or a constant pool pointer, that may be found in a stack-based processing system. This means that situations may arise where stack operands held within the set of registers may need to be moved back to the stack (in memory) to provide room for new stack operands to be placed within the set of registers.
Known systems that use registers to implement a portion of a memory stack realize certain efficiency gains over traditional use of memory stacks, as movement of data among processor registers is faster than movement of data between registers and memory. However, the known implementations suffer various shortcomings. One shortcoming is manifest once the stack has overfilled the registers. After the stack registers have been filled, further pushes and pops from the stack result in excessive reads and writes from external memory (one for each PUSH or pop), resulting in increased memory traffic and excessive power consumption. Particularly in portable (e.g, battery-operated) devices, there is a significant desire to improve power consumption where possible.